package com.cdvtc.flower.dao.impl;

import com.cdvtc.flower.dao.ProductsDao;
import com.cdvtc.flower.model.Category;
import com.cdvtc.flower.model.Products;
import com.cdvtc.flower.util.DBUtil;

import java.math.BigDecimal;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class ProductsDaoImpl implements ProductsDao { // 建议将类名更改为 FlowerDaoImpl 或 ProductDaoImpl

    // 如果这个连接字段在其他地方也被使用，请保留它。否则，可以从类中移除它。  
    // private Connection conn; // 这个字段可能不再需要，除非你在其他地方使用它  

    @Override
    public List<Products> getAllProducts() { // 方法名已更改为遵循Java命名约定
        List<Products> products = new ArrayList<>();

        try (Connection conn = DBUtil.getConnection(); // 使用try-with-resources自动关闭连接  
             Statement st = conn.createStatement(); // 使用try-with-resources自动关闭Statement  
             ResultSet rs = st.executeQuery("SELECT * FROM products")) { // 查询所有产品  

            // 从rs中获取数据  
            while (rs.next()) {
                int product_id = rs.getInt("product_id");
                int merchant_id = rs.getInt("merchant_id");
                int category_id = rs.getInt("category_id");
                BigDecimal original_price = rs.getBigDecimal("original_price");
                BigDecimal sale_price = rs.getBigDecimal("sale_price");

                String product_name = rs.getString("product_name");
                String image = rs.getString("image");
                String description = rs.getString("description");
                boolean sold = rs.getBoolean("sold");

                // 将数据写入封装对象  
                Products product = new Products();
                product.setProduct_id(product_id); // 假设set方法遵循JavaBean规范
                product.setMerchant_id(merchant_id);
                product.setCategory_id(category_id);
                product.setProduct_name(product_name);
                product.setImage(image);
                product.setOriginal_price(original_price);
                product.setSale_price(sale_price);
                product.setDescription(description);
                product.setSold(sold); // 假设Products类有这个set方法  

                products.add(product); // 将产品添加到列表中  
            }

        } catch (SQLException e) {
            // 处理数据库相关的异常  
            e.printStackTrace(); // 这只是暂时的，你应该使用更合适的日志记录方法  
            // 可以在这里抛出异常或返回一个空的列表，具体取决于你的应用需求  
        }

        return products; // 返回产品列表  
    }

    @Override
    public void updateProduct(Products products) {
        try (Connection conn = DBUtil.getConnection(); // 使用try-with-resources自动关闭连接
             PreparedStatement pstmt = conn.prepareStatement(
                     "UPDATE products SET merchant_id = ?, category_id = ?, product_name = ?, " +
                             "image = ?, original_price = ?, sale_price = ?, description = ?, sold = ? " +
                             "WHERE product_id = ?")) { // 准备SQL语句以更新产品

            // 设置更新的字段值
            pstmt.setInt(1, products.getMerchant_id());
            pstmt.setInt(2, products.getCategory_id());
            pstmt.setString(3, products.getProduct_name());
            pstmt.setString(4, products.getImage());
            pstmt.setBigDecimal(5, products.getOriginal_price());
            pstmt.setBigDecimal(6, products.getSale_price());
            pstmt.setString(7, products.getDescription());
            pstmt.setBoolean(8, products.getSold()); // 假设有一个isSold()方法

            // 设置WHERE子句中的产品ID
            pstmt.setInt(9, products.getProduct_id());

            // 执行更新
            pstmt.executeUpdate();

        } catch (SQLException e) {
            // 处理数据库相关的异常
            e.printStackTrace(); // 这只是暂时的，你应该使用更合适的日志记录方法
            // 在这里你可以抛出异常或进行其他错误处理
        }
    }


    @Override
    public Products getProductById(int product_id) {
        Products product = null;

        try (Connection conn = DBUtil.getConnection(); // 使用try-with-resources自动关闭连接
             PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM products WHERE product_id = ?")) { // 使用PreparedStatement来避免SQL注入

            pstmt.setInt(1, product_id); // 设置参数

            try (ResultSet rs = pstmt.executeQuery()) { // 查询数据库
                if (rs.next()) { // 如果有结果
                    // 从rs中获取数据
                    int merchant_id = rs.getInt("merchant_id");
                    int category_id = rs.getInt("category_id");
                    BigDecimal original_price = rs.getBigDecimal("original_price");
                    BigDecimal sale_price = rs.getBigDecimal("sale_price");

                    String product_name = rs.getString("product_name");
                    String image = rs.getString("image");
                    String description = rs.getString("description");
                    boolean sold = rs.getBoolean("sold");

                    // 将数据写入封装对象
                    product = new Products();
                    product.setProduct_id(product_id); // 设置ID，因为我们已经有了这个值
                    product.setMerchant_id(merchant_id);
                    product.setCategory_id(category_id);
                    product.setProduct_name(product_name);
                    product.setImage(image);
                    product.setOriginal_price(original_price);
                    product.setSale_price(sale_price);
                    product.setDescription(description);
                    product.setSold(sold);
                }
            }

        } catch (SQLException e) {
            // 处理数据库相关的异常
            e.printStackTrace(); // 这只是暂时的，你应该使用更合适的日志记录方法
            // 可以在这里抛出异常或返回null，具体取决于你的应用需求
        }

        return product; // 返回找到的产品，如果没有找到则返回null
    }
@Override
    public List<Products> getProductsOnSale() {
        // 假设您正在使用JDBC或某个ORM框架如Hibernate
        // 这里只是一个示例，您需要根据您的数据库和框架来调整代码
        List<Products> productsOnSale = new ArrayList<>();

        String sql = "SELECT * FROM products WHERE sold = ?";
        try (Connection conn = DBUtil.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {

            pstmt.setBoolean(1, true); // 设置sold为true
            ResultSet rs = pstmt.executeQuery();
            while (rs.next()) {
                BigDecimal original_price = rs.getBigDecimal("original_price");
                BigDecimal sale_price = rs.getBigDecimal("sale_price");
                int product_id = rs.getInt("product_id");
                int merchant_id = rs.getInt("merchant_id");
                int category_id = rs.getInt("category_id");
                String product_name = rs.getString("product_name");
                String image = rs.getString("image");
                String description = rs.getString("description");
                boolean sold = rs.getBoolean("sold");
                Products product = new Products(); // 假设Products类有一个合适的构造函数
                // 填充product对象的属性
                product.setProduct_id(product_id); // 设置ID，因为我们已经有了这个值
                product.setMerchant_id(merchant_id);
                product.setCategory_id(category_id);
                product.setProduct_name(product_name);
                product.setImage(image);
                product.setOriginal_price(original_price);
                product.setSale_price(sale_price);
                product.setDescription(description);
                product.setSold(sold);
                // ... 其他字段 ...
                productsOnSale.add(product);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return productsOnSale;
    }

    @Override
    public String DeleteProduct(int product_id) {
        String message = "";

        // 假设有订单表和库存表，分别检查这些表中是否存在与产品相关的记录
        // 这里使用伪代码来表示查询过程，因为具体的表结构和字段名取决于您的数据库设计

        try (Connection conn = DBUtil.getConnection()) {
            // 检查订单表中是否有与该产品相关的订单
            String checkOrderSql = "SELECT COUNT(*) FROM orderdetails WHERE product_id = ?";
            try (PreparedStatement checkOrderStmt = conn.prepareStatement(checkOrderSql)) {
                checkOrderStmt.setInt(1, product_id);
                try (ResultSet rs = checkOrderStmt.executeQuery()) {
                    if (rs.next() && rs.getInt(1) > 0) {
                        // 如果存在订单，则不允许删除产品
                        message = "产品下有订单信息，不允许删除！";
                        return message; // 直接返回错误信息，不再继续执行删除操作
                    }
                }
            }

            // 如果没有关联的订单和库存，则执行删除操作
            String deleteProductSql = "DELETE FROM products WHERE product_id = ?";
            try (PreparedStatement deleteStmt = conn.prepareStatement(deleteProductSql)) {
                deleteStmt.setInt(1, product_id);
                int rowsAffected = deleteStmt.executeUpdate();
                if (rowsAffected == 1) {
                    message = "产品删除成功！";
                } else {
                    // 如果没有产品被删除（可能是ID不存在），可以返回一个不同的消息
                    message = "产品不存在或删除失败！";
                }
            }
        } catch (SQLException e) {
            // 处理数据库相关的异常
            e.printStackTrace(); // 这只是暂时的，你应该使用更合适的日志记录方法
            message = "删除产品时发生错误，请稍后再试！";
        }

        return message; // 返回删除操作的结果消息

    }
@Override
    public int getNextProductId() throws SQLException {
        // 连接到数据库
        Connection conn = DBUtil.getConnection(); // 获取数据库连接

        // 执行查询以获取当前的最大product_id
        String sql = "SELECT MAX(product_id) FROM products";
        PreparedStatement pstmt = conn.prepareStatement(sql);
        ResultSet rs = pstmt.executeQuery();

        int maxId = 0;
        if (rs.next()) {
            maxId = rs.getInt(1);
        }

        // 关闭结果集、预处理语句和连接（这里省略了异常处理）
        rs.close();
        pstmt.close();
        conn.close();

        // 返回最大值加1
        return maxId + 1;
    }

    @Override
    public boolean addProduct(Products products) {
        try {
            //获取连接
            Connection con = DBUtil.getConnection();

            //执行查询并返回结果集
            PreparedStatement pst = con.prepareStatement("insert into products(product_id, merchant_id, category_id, product_name, image, original_price, sale_price, description, sold) values(?, ?, ?, ?, ?, ?, ?, ?, ?)");
            pst.setInt(1, products.getProduct_id());
            pst.setInt(2, products.getMerchant_id());
            pst.setInt(3, products.getCategory_id());
            pst.setString(4, products.getProduct_name());
            pst.setString(5, products.getImage()); //需要将java.util.Date转化为java.sql.Date
            pst.setBigDecimal(6, products.getOriginal_price());
            pst.setBigDecimal(7, products.getSale_price());
            pst.setString(8, products.getDescription()); //当前时间作为注册时间
            pst.setBoolean(9, products.getSold()); //默认为不禁用

            int result = pst.executeUpdate();

            //释放连接资源
            pst.close();
            con.close();

            return result > 0; //大于0表示成功创建一行
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return false;
    }

@Override
    public Products getProduct(int product_id) {
    Connection con = DBUtil.getConnection();
        try {
            String query = "select *, category.category_name cname from products left join category on category.category_id=products.category_id where product_id=? ";

            PreparedStatement pst = con.prepareStatement(query);
            pst.setInt(1, product_id);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                Products products = new Products();
                products.setMerchant_id(rs.getInt("merchant_id"));
                products.setSold(rs.getBoolean("sold"));
                products.setCategory_id(rs.getInt("category_id"));
                products.setProduct_id(rs.getInt("product_id"));
                products.setProduct_name(rs.getString("product_name"));
                products.setOriginal_price(rs.getBigDecimal("original_price"));
                products.setDescription(rs.getString("description"));
                products.setSale_price(rs.getBigDecimal("sale_price"));
                products.setImage(rs.getString("image"));

                Category category = new Category();
                category.setCategory_id(rs.getInt("category_id"));
                category.setCategory_name(rs.getString("category_name"));
                products.setCategory(category);

                return products;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }
    public static void main(String[] args) throws SQLException {
        ProductsDao productsDao = new ProductsDaoImpl();
        System.out.println(productsDao.getNextProductId());
    }
}